#ifndef __M_MEMORY_H
#define __M_MEMORY_H

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 边界标志（Magic Number）
#define BLOCK_HEADER_MAGIC 0xDEADBEEF
#define BLOCK_FOOTER_MAGIC 0xFEEDFACE

#define CANARY_VALUE       0xCAFEBABE

typedef struct MemoryBlock {
    uint32_t canary_start;   // 哨兵值 - 开头
    size_t header_magic;     // 魔数用于检测溢出
    size_t size;             // 块大小（不含头部和尾部）
    int is_allocated;        // 是否被分配
    struct MemoryBlock* prev;
    struct MemoryBlock* next;
    size_t footer_magic;     // 尾部魔数
    uint32_t canary_end;     // 哨兵值 - 结尾
} MemoryBlock;

// 内存池管理结构体
typedef struct {
    MemoryBlock* head;        // 所有内存块链表头指针
    void* pool_start;         // 内存池起始地址
    size_t pool_size;         // 内存池总大小
    size_t used_blocks;       // 已使用块数量
    size_t free_blocks;       // 空闲块数量
    size_t total_alloc_size;  // 已分配的总数据大小
    uint32_t free_call_count;
} MemoryPoolManager;

void mempool_init(MemoryPoolManager* mgr, void* buffer, size_t buffer_size);
int is_valid_block(MemoryBlock* block);
void merge_free_blocks(MemoryPoolManager* mgr, MemoryBlock* block);
void* mempool_alloc(MemoryPoolManager* mgr, size_t size);
void mempool_free(MemoryPoolManager* mgr, void* ptr);
void mempool_print_status(MemoryPoolManager* mgr);
#endif